package org.example.likou150.array;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

/*
 * https://leetcode.cn/problems/two-sum-ii-input-array-is-sorted/?envType=study-plan-v2&envId=top-interview-150
 * */
public class ThreeSum {
    public static void main(String[] args) {
        int[] nums = new int[]{0,0,0};
        ThreeSum threeSum = new ThreeSum();
        List<List<Integer>> lists = threeSum.threeSum(nums);
        System.out.println(lists);
    }

//    public List<List<Integer>> threeSum(int[] nums) {
//        List<List<Integer>> ans = new ArrayList();
//        int len = nums.length;
//        if (nums == null || len < 3) return ans;
//        Arrays.sort(nums); // 排序
//        for (int i = 0; i < len; i++) {
//            if (nums[i] > 0) break; // 如果当前数字大于0，则三数之和一定大于0，所以结束循环
//            if (i > 0 && nums[i] == nums[i - 1]) continue; // 去重
//            int L = i + 1;
//            int R = len - 1;
//            while (L < R) {
//                int sum = nums[i] + nums[L] + nums[R];
//                if (sum == 0) {
//                    ans.add(Arrays.asList(nums[i], nums[L], nums[R]));
//                    while (L < R && nums[L] == nums[L + 1]) L++; // 去重
//                    while (L < R && nums[R] == nums[R - 1]) R--; // 去重
//                    L++;
//                    R--;
//                } else if (sum < 0) L++;
//                else if (sum > 0) R--;
//            }
//        }
//        return ans;
//     }

    public List<List<Integer>> threeSum(int[] nums) {
        List<List<Integer>> result = new ArrayList<>();
        Arrays.sort(nums);
        for (int i = 0; i < nums.length-2; i++) {
            if(nums[i]>0){continue;}
            if(i > 0 && nums[i] == nums[i-1]) continue;
            int towIndex=i+1;
            int threeIndex=nums.length-1;
            while(towIndex<threeIndex){
                if(nums[towIndex]+nums[threeIndex]+nums[i]>0){
                   threeIndex--;
                   continue;
                }
                if(nums[towIndex]+nums[threeIndex]+nums[i]<0){
                   towIndex++;
                   continue;
                }
                if(nums[towIndex]+nums[threeIndex]+nums[i]==0){
                    List<Integer> list=new ArrayList<>();
                    list.addAll(Arrays.asList(new Integer[]{nums[i],nums[towIndex],nums[threeIndex]}));
                    result.add(list);
                    do {
                        towIndex++;
                    }while (towIndex<threeIndex && nums[towIndex]==nums[towIndex-1]);
                    do {
                        threeIndex--;
                    }while (towIndex<threeIndex &&  nums[threeIndex]==nums[threeIndex+1]);
                }
            }
        }
        return result;
    }

//    public List<List<Integer>> threeSum(int[] nums) {
//        List<List<Integer>> resultList=new ArrayList<>();
//        for(int i=0;i<nums.length;i++){
//            for(int j=i+1;j<nums.length;j++){
//                processNums(resultList, nums, i , j);
//            }
//        }
//        return resultList;
//    }
//
//    private void processNums(List<List<Integer>> resultList, int[] nums, int i, int j) {
//        int sum=nums[i]+nums[j];
//        for (int i1 = j+1; i1 < nums.length; i1++) {
//            if(nums[i1]+sum==0){
//                resultList.add(Arrays.asList(new Integer[]{nums[i], nums[j], nums[i1]}));
//                return;
//            }
//        }
//    }
    }
